var util = require("util");
var fs = require("fs");
var delimiteur = ";";
var EOL = "\n";

menu();

function menu() {
    console.log("1: Importer la liste des contacts au format vCard");
    console.log("2: Creer un ficher de contact");
    console.log("3: Modifier un ficher de contact");
    console.log("4: Supprimer un ficher de contact");
    console.log("5: Rechercher un contact et afficher ses informations s'il existe");
    ask("choisissez votre fonction", /^[0-9]+$/, function(line) {
        switch (line.trim()) {
            case '1' : 
                importVcard();
                break;
            case '2' :
				creerContact();
                break;
			case '3' :
				ask("choisissez le nom", /[A-Za-z]/, function(nom) {
                    ask("choisissez le prenom", /[A-Za-z]/, function(prenom) {
                        modificationDeContact(nom, prenom);
                       
                    });
                });
				
				break;
			case '4' :
				ask("choisissez le nom", /[A-Za-z]/, function(nom) {
                    ask("choisissez le prenom", /[A-Za-z]/, function(prenom) {
                        suppressionDeContact(nom, prenom);
                       
                    });
                });
				
				break;
            case '5':
                ask("choisissez le nom", /[A-Za-z]/, function(nom) {
                    ask("choisissez le prenom", /[A-Za-z]/, function(prenom) {
                        recupeInfoCSV(nom, prenom);
						menu();
                    });
                });
                break;
        }
    });
}

function ask(question, format, callback) {
    var stdin = process.stdin, stdout = process.stdout;
    stdin.resume();
    stdout.write(question + ": ");
    stdin.once('data', function(data) {
        data = data.toString().trim();
        if (format.test(data)) {
            callback(data);
        } else {
            stdout.write("Format incorrect, celui ci doit être sous la forme: " + format + "\n");
            ask(question, format, callback);
        }
    });
}

//Classe Contact
function Contact() {
    var nom;
	var prenom;
    var organisation;
    var fonction;
    var tel;
	var mobile;
	var mail;
    //Constructeur de contact
    function Contact(nom, prenom, organisation, fonction, tel, mobile, mail) {
        this.nom = nom;
		this.prenom = prenom
        this.organisation = organisation;
        this.fonction = fonction;
		this.tel = tel;
        this.mobile = mobile;
		this.mail = mail;
    }
}

function creationVcard(nom, prenom, mail, mobile, tel, org, fonction){
	totalString = ("BEGIN:VCARD\r" + "VERSION:3.0\r" + "FN:" + prenom + " " + nom + "\r" + "N:" + nom + ";" + prenom + "\r" + "EMAIL;TYPE=INTERNET:" + mail + "\r" + "TEL;TYPE=WORK:" + mobile + "\r" + "TEL;TYPE=HOME:" + tel + "\r" + "ORG:" + org + "\r" + "TITLE:" + fonction + "\r" + "END:VCARD");
	name = ("./data/" + nom + "_" + prenom + ".vcf");
	
	fs.writeFile(name, totalString, function (err) {
			if (err) return console.log(err);
			console.log('Ajout fiche vcf');
	});
}

function ajoutCsv(nom, prenom, org, fonction, tel, mobile, mail) {

	var content;
	function readContent(callback) {
		fs.readFile("./data/contacts.csv", function (err, content) {
			if (err) return callback(err)
			callback(null, content)
		})
	}

	readContent(function (err, content) {
		content = (content + "\r" + nom + ";" + prenom + ";" + org + ";" + fonction + ";" + tel + ";" + mobile + ";" + mail);
		console.log(content)
			fs.writeFile("./data/contacts.csv", content, function (err) {
			if (err) return console.log(err);
			console.log('personne ajoutée dans le csv !');
			});
	})
}

function importVcard(){
	ask('chemin du fichier .vcf', /.*/, function(chemin) {
        fs.readFile(chemin, function(err, data) {
            if (err) throw err;
			var lignes = data.toString().split("\r");
			var datas = new Array();
			for (var i = 0; i < lignes.length; i++) {
				datas[i] = lignes[i].toString().split(":");
				console.log(datas[i]);
			}
			
			var personne = datas[2][1].toString().split(" ");
			personne[0] = personne[0].charAt(0).toUpperCase() + personne[0].substring(1).toLowerCase();
			
			personne[1] = personne[1].charAt(0).toUpperCase() + personne[1].substring(1).toLowerCase();
			personne[1] = personne[1].replace(/[\r]/g, "");
			
			datas[7][1] = datas[7][1].replace(/[\r]/g, "");
			
			datas[8][1] = datas[8][1].replace(/[\r]/g, "");
			
			datas[5][1] = datas[5][1].replace(/[\r]/g, "");
			datas[6][1] = datas[6][1].replace(/[\r]/g, "");
			
			var mobile = datas[5][1];
			datas[4][1] = datas[4][1].replace(/[\r]/g, "");
			
			var nom = personne[1];
			var org = datas[7][1];
			var fonction = datas[8][1];
			var tel =datas[6][1];
			var prenom = personne[0];
			var mail = datas[4][1];
			
			name = ("./data/" + nom + "_" + prenom + ".vcf");
			fs.exists(name,function(exists){
				if (exists == false) {
					creationVcard(nom, prenom, mail, mobile, tel, org, fonction);
					ajoutCsv(nom, prenom, org, fonction, tel, mobile, mail);
					}
				else {
				console.log("le contact existe déjà!");
				}
				});
		});
	});
}


function creerContact(){
ask("choisissez le nom", /\b[A-Z][a-z]+/, function(nom) {
        ask("choisissez votre prenom", /\b[A-Z][a-z]+/, function(prenom) {
            ask("choisissez votre organisation", /^[a-zA-Z0-9]+$/, function(org) {
                ask("choisissez votre fonction", /^[a-zA-Z]+$/, function(fonction) {
                    ask("choisissez votre mobile", /^[0-9\ ]+$/, function(mobile) {
                        ask("choisissez votre fixe", /^[0-9\ ]+$/, function(tel) {
                            ask("choisissez votre email", /^(.+)@/, function(mail) {
								name = ("./data/" + nom + "_" + prenom + ".vcf");
								fs.exists(name,function(exists){
									if (exists == false) {
										creationVcard(nom, prenom, mail, mobile, tel, org, fonction);
										ajoutCsv(nom, prenom, org, fonction, tel, mobile, mail);
										}
									else {
									console.log("le contact existe déjà!");
									}
								});
							});
                        });
                    });
                });
            });
        });
    });
}
//fonction de récupération et d'affichage des informations du client sur le CSV
function recupeInfoCSV(nom, prenom) {
    
    console.log('Vous souhaitez afficher les informations du client : ' + nom + ' ' + prenom);
    //def des variables count (compteur standard)  et position (indiquera la position du client cherché dans l'array crée)
    var count = 0;
    var position = 0;
    //récupération du fichier csv
    fs.readFile('./data/contacts.csv', function (err, data) {
        
        if (err) throw err;
        
        //initialisation des variables
        //le la variable contenant les données du fichier csv séparées
        var impText = data.toString().split("\r");
        //Stock temporairement les clients le temps de trouver celui cherché
        var stockTemp = new Array();
        //Stock les informations du client
        var stockInfo = new Array();
        
        //affiche la BD séparée client par client
        for (i in impText) {
            console.log(impText[i]);
        }
        
        //Stock les information de chaque client séparé a l'interieur de stockInfo, ensuite chaque stockInfo est stocker dans stockTemp pour avoir tout les clients en array 2x2 
        for (var j = 0; j < impText.length; j++) {
            stockTemp[j] = new Array();
            stockInfo = impText[j].split(";");
            for (k = 0; k < 7; k++) {
                stockTemp[j][k] = stockInfo[k];
            }
        }
        
        //Recherche du client recherché dans stockTemp et remplissage da avantC et apresC avec les clients trouvé n'etant pas celui recherché
        for (var j = 0; j < impText.length; j++) {
            if (stockTemp[j][0] == nom && stockTemp[j][1] == prenom) {
                count++;
                position = j;
            }
        }
        
        // si le client à été trouvé, le compteur aura été incrementé
        if (count == 1) {
            console.log('Le client à afficher existe!');
			//on affiche les données du client trouvé sous la forme nom : Leblond
			for (var k = 0; k < 7; k++) {
            console.log(stockTemp[0][k] + " : " + stockTemp[position][k] + ' ');
			}
        } 
        
        else {
            console.log("Le client n'apparait pas dans la base de données");
        }
        
        
        menu();
    });

}

//cette fonction permet la modification d'un certain client (le debut de la fonction reprends la fonction recupeInfoCSV pour recupere le client cherché)
function modificationDeContact(nom, prenom) {
    
    console.log('Vous souhaitez modifier : ' + nom + ' ' + prenom);
    
    //def des variables count (compteur standard)  et position (indiquera la position du client cherché dans l'array crée)
    var count = 0;
    var position = 0;
    
    fs.readFile('./data/contacts.csv', function (err, data) {
        
        if (err) throw err;
        
        //initialisation des variables
        //le la variable contenant les données du fichier csv séparées
        var impText = data.toString().split("\r");
        //Stock temporairement les clients le temps de trouver celui cherché
        var stockTemp = new Array();
        //Stock les informations du client
        var stockInfo = new Array();
        //Stock tous les client avant celui recherché
        var avantC = null;
        //Stock tous les clients après celui recherché
        var apresC = null;
        //Stock les informations du client à modifier
        var client = null;
        
        //affiche la BD séparée client par client
        for (i in impText) {
            console.log(impText[i]);
        }
        
        //Stock les information de chaque client séparé a l'interieur de stockInfo, ensuite chaque stockInfo est stocker dans stockTemp pour avoir tout les clients en array 2x2 
        for (var j = 0; j < impText.length; j++) {
            stockTemp[j] = new Array();
            stockInfo = impText[j].split(";");
            for (var k = 0; k < 7; k++) {
                stockTemp[j][k] = stockInfo[k];
            }
        }
        
        //Recherche du client recherché dans stockTemp et remplissage da avantC et apresC avec les clients trouvé n'etant pas celui recherché
        for (var j = 0; j < impText.length; j++) {
            
            if (stockTemp[j][0] == nom && stockTemp[j][1] == prenom) {
                count++;
                position = j;
            } 
            
            else if (count == 0) {
                for (var countPropA = 0; countPropA < 6; countPropA++) {
                    //si avantC est nul (1er element) on lui ajoute l'element en cour
                    if (avantC == null) {
                        avantC = (stockTemp[j][countPropA] + ";");
                    } 
                    
                    else {
                        avantC += (stockTemp[j][countPropA] + ";");
                    }

                }
                avantC += (stockTemp[j][6] + "\r");
            } 
            
            //une fois l'element trouvé on ajoute tout les element à apresC
            else {
                for (var countPropB = 0; countPropB < 6; countPropB++) {
                    if (apresC == null) {
                        apresC = (stockTemp[j][countPropB] + ";");
                    } 
                    
                    else {
                        apresC += (stockTemp[j][countPropB] + ";");
                    }

                }
                apresC += (stockTemp[j][6] + "\r");
            }
        }
        
        // si le client à été trouvé, le compteur aura été incrementé
        if (count == 1) {
            console.log('Le client à modifier à été trouvé');
        
        
        //on affiche les données du client trouvé sous la forme nom : Leblond
        for (var k = 0; k < 7; k++) {
            console.log(stockTemp[0][k] + " : " + stockTemp[position][k] + ' ');
        }
        
        
        //Nous avons decidé de ne pas faire plusieur requete de changement mais simplement de recuperer tout les changement à effectuer et d'ensuite les faire tous ensemble
        ask("Entrez le nouveau nom", /[A-Z]+/, function (newName) {
            ask("Entrez le nouveau prenom", /\b[A-Z][a-z]+/, function (newFName) {
                ask("Entrez le nom de la nouvelle organisation", /^[a-zA-Z0-9]+$/, function (newOrg) {
                    ask("Entrez votre nouvelle fonction", /^[a-zA-Z]+$/, function (newFxn) {
                            ask("Entrez votre nouveau numéro mobile", /^[0-9\ ]+$/, function (newCellNum) {
                                ask("Entrez votre nouveau numéro fixe", /^[0-9\ ]+$/, function (newPhoneNum) {
                                    ask("Entrez votre nouvelle adresse email", /^(.+)@/, function (newEmail) {

                                        //le client est en fait simplement créé et le fichier est reconstruit autour avec les parties avantC et apresC
                                        client = (newName + ";" + newFName + ";" + newOrg + ";" + newFxn + ";" + newCellNum + ";" + newPhoneNum + ";" + newEmail + "\r");
                                        fs.writeFile('./data/contacts.csv', avantC + client + apresC);

                                        name = ("./data/" + nom + "_" + prenom + ".vcf");
       									fs.unlink(name, function (err) {
 										if (err) throw err;
										});

                                        creationVcard(newName, newFName, newEmail, newCellNum, newPhoneNum, newOrg, newFxn);

                                        console.log("Les modifications sur " + client + " ont été effectuées");

                                        //on retourne au menu
                                        
    
                                    });
                                });
                            });
                    });
                });
            });
        });
		} 
        
        else {
            console.log("Le client n'apparait pas dans la base de données");
        }
    });
}

//Reprend la fonction modificationDeContact mais on rattache juste avantC et apresC une fois l'element à supprimer éliminé
function suppressionDeContact(nom, prenom) {
    console.log('Vous souhaitez supprimer : ' + nom + ' ' + prenom);
    
    //def des variables count (compteur standard)  et position (indiquera la position du client cherché dans l'array crée
    var count = 0;
    var position = 0;
    
    fs.readFile('./data/contacts.csv', function (err, data) {
        
        if (err) throw err;
        
        //initialisation des variables
        //le la variable contenant les données du fichier csv séparées
		var impText = new Array();
        impText = data.toString().split("\r");
        //Stock temporairement les clients le temps de trouver celui cherché
        var stockTemp = new Array();
        //Stock les informations du client
        var stockInfo = new Array();
        //Stock tous les client avant celui recherché
        var avantC = null;
        //Stock tous les clients après celui recherché
        var apresC = null;
        
        //affiche la BD séparée client par client
        for (var i = 0; i < impText.length; i++) {
            console.log(impText[i]);
			console.log(impText.length);
        }
		
        //Stock les information de chaque client séparé a l'interieur de stockInfo, ensuite chaque stockInfo est stocker dans stockTemp pour avoir tout les clients en array 2x2 
        for (var j = 0; j < impText.length; j++) {
            stockTemp[j] = new Array();
            stockInfo = impText[j].split(";");
            for (var k = 0; k < 7; k++) {
                stockTemp[j][k] = stockInfo[k];
            }
        }
        
        //Recherche du client recherché dans stockTemp et remplissage da avantC et apresC avec les clients trouvé n'etant pas celui recherché
        for (var j = 0; j < impText.length; j++) {
            if (stockTemp[j][0] == nom && stockTemp[j][1] == prenom) {
                count++;
                position = j;
            } 
            
            else if (count == 0) {
                for (var countPropA = 0; countPropA < 6; countPropA++) {
                    //si avantC est nul (1er element) on lui ajoute l'element en cour
                    if (avantC == null) {
                        avantC = (stockTemp[j][countPropA] + ";");
                    } 
                    
                    else {
                        avantC += (stockTemp[j][countPropA] + ";");
                    }

                }
                avantC += (stockTemp[j][6] + "\r");
            } 
            
            //une fois l'element trouvé on ajoute tout les element à apresC
            else {
                for (var countPropB = 0; countPropB < 6; countPropB++) {
                    if (apresC == null) {
                        apresC = (stockTemp[j][countPropB] + ";");
                    } 
                    
                    else {
                        apresC += (stockTemp[j][countPropB] + ";");
                    }

                }
                apresC += (stockTemp[j][6] + "\r");
            }
        }
        // si le client à été trouvé, le compteur aura été incrementé
        if (count == 1) {
            console.log('Le client à supprimer à été trouvé');
			 //on affiche les données du client trouvé sous la forme nom : Leblond
			for (var k = 0; k < 7; k++) {
				console.log(stockTemp[0][k] + " : " + stockTemp[position][k] + ' ');
			}
			var finalData = (avantC + apresC);
			fs.writeFile('./data/contacts.csv', finalData);
			name = ("./data/" + nom + "_" + prenom + ".vcf");
			fs.unlink(name, function (err) {
 			if (err) throw err;
 			
			});

        console.log("La suppression du client: "+nom+", "+prenom+" à été effectuée");
        
        } 
        
        else {
            console.log("Le client n'apparait pas dans la base de données");
        }
       
        menu();
        
    });
}